// #include <iostream>
// #include <string>
// #include <regex>

// int main()
// {
//     //原始字符串
//     std::string str = "/numbers/1234";

//     // 匹配以 /numbers/起始，后边跟了一个或多个数字字符的字符串，并且在匹配的过程中提取这个匹配到的数字字符串
//     //   \d表示提取数字 +表示匹配到后继续匹配
//     std::regex e("/numbers/(\\d+)");

//     //提取到后放入容器
//     std::smatch matches;

//     bool ret = std::regex_match(str, matches, e);
//     if (ret == false) {
//         return -1;
//     }
//     for (auto &s : matches) {
//         std::cout << s << std::endl;
//     }
//     return 0;
// }

#include <iostream>
#include <string>
#include <regex>

int main()
{
    // HTTP请求行格式:  GET /baidu/login?user=zhangsan&pass=123123 HTTP/1.1\r\n
    std::string str = "get /baidu/login?user=zhangsan&pass=123123 HTTP/1.1\r\n";
    std::smatch matches;
    // 请求方法的匹配  GET HEAD POST PUT DELETE ....
    //     (GET|HEAD|POST|PUT|DELETE)：这部分使用圆括号()定义了一个捕获组，用于匹配HTTP请求方法。
    //     竖线|表示“或”，所以这部分可以匹配GET、HEAD、POST、PUT或DELETE中的任意一个。
    // .*：这部分表示匹配任意字符（.）任意次数（*），直到字符串的末尾。这意味着在请求方法之后，可以跟任意内容。
    //std::regex e("(GET|HEAD|POST|PUT|DELETE) .*");
    //std::regex e("(GET|HEAD|POST|PUT|DELETE) ([^?]*).*");//[^?]匹配非?字符  *匹配任意次数
    //std::regex e("(GET|HEAD|POST|PUT|DELETE) ([^?]*)\\?(.*) .*");//\\?表示原始的?  (.*)提取任意字符任意次数直到空格
    //std::regex e("(GET|HEAD|POST|PUT|DELETE) ([^?]*)\\?(.*) (HTTP/1\\.[01])");//表示匹配HTTP1. [01]表示0或者1都行
    std::regex e("(GET|HEAD|POST|PUT|DELETE) ([^?]*)(?:\\?(.*))? (HTTP/1\\.[01])(?:\n|\r\n)?",std::regex::icase);
    //?: 表示匹配后面的字符但是不提取  最后的?表示匹配前面的字符1或0次，允许没有
    
    
    bool ret = std::regex_match(str, matches, e);
    std::string method = matches[1];
    std::cout<<method<<std::endl;
    std::transform(method.begin(),method.end(),method.begin(),toupper);
    std::cout<<method<<std::endl;
    if (ret == false)
    {
        return -1;
    }
    int i = 0;
    for (auto &s : matches)
    {
        std::cout <<i++<<" : " << s << std::endl;
    }
    return 0;
}



// template <class T>
// class Any
// {
//     template <class T>
//     class PlaceHolder
//     {
//         //...
//     };
// private:
//     PlaceHolder<T> _content;
// };




// class Any
// {
//     class Holder
//     {
//         //...
//     };
//     template <class T>
//     class PlaceHolder:public Holder
//     {
//         T _val;//存放T类型的数据
//     };
// private:
//     Holder* _content;
// };